/**
 * @addtogroup gbc_msg_17691
 * gbc_17691_encrypt_interface
 * @{
 */
/**
 * @file         gbc_17691_encrypt_interface.h
 * @brief        数据加密接口
 * @note
 * @author       Dengdeshou
 * @date         2020-08-19
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-08-19  <td>1.0                   <td>Dengdeshou      <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _SCC_GBC17691_ENCRYPT_INTERFACE_H_
#define _SCC_GBC17691_ENCRYPT_INTERFACE_H_

#include "ofc/ofc_object.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct IGbc17691EncryptTag IGbc17691Encrypt;
/**
 * 数字签名内容
 */
typedef struct TGbc17691SignatureTag TGbc17691Signature;
struct TGbc17691SignatureTag
{
    UInt8 r_len;        ///< R值长度
    UInt8 r_value[32];     ///< 签名R值
    UInt8 s_len;        ///< S值长度
    UInt8 s_value[32];     ///< 签名S值
};

/**
 * 获取芯片ID接口
 * @param sender: 对象指针
 * @param buf: 存放芯片ID的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的芯片ID的长度，负数为错误码
 */
typedef Int32(*IGbc17691DoChipId)(IGbc17691Encrypt *sender, UInt8 *buf, UInt16 buf_len);

/**
 * 获取加密公钥接口
 * @param sender: 对象指针
 * @param buf: 存放公钥的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的公钥的长度，负数为错误码
 */
typedef Int32(*IGbc17691DoPublicKey)(IGbc17691Encrypt *sender, UInt8 *buf, UInt16 buf_len);

/**
 * 获取签名值接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待签名内容
 * @param content_len: 待签名内容长度
 * @param signature: 加密后的数字签名
 * @return 获得签名数据的长度，负数为错误码
 */
typedef Int32(*IGbc17691DoSignature)(IGbc17691Encrypt *sender, UInt8 encrypt_type, UInt8 *content, UInt16 content_len, TGbc17691Signature *signature);

/**
 * 加密接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待加密内容
 * @param content_len: 待加密内容长度
 * @param cipher: 加密缓存
 * @param cipher_len: 加密缓存长度
 * @return 获得加密数据的长度，<=0 表示异常
 */
typedef Int32(*IGbc17691DoEncryptData)(IGbc17691Encrypt *sender, UInt8 encrypt_type, UInt8 *msg, UInt16 msg_len, UInt8 *cipher, UInt16 cipher_len);

struct IGbc17691EncryptTag
{
PROTECTED
    IGbc17691DoChipId DoChipId;
    IGbc17691DoPublicKey DoPublicKey;
    IGbc17691DoSignature DoSignature;
    IGbc17691DoEncryptData DoEncryptdata;
};

/**
 * 获取芯片ID
 * @param sender: 对象指针
 * @param buf: 存放芯片ID的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的芯片ID的长度，负数为错误码
 */
Int32 IGbc17691ChipId(IGbc17691Encrypt *self, UInt8 *buf, UInt16 buf_len);

/**
 * 获取加密公钥
 * @param sender: 对象指针
 * @param buf: 存放公钥的缓冲区
 * @param buf_len: 缓冲区长度
 * @return 获得的公钥的长度，负数为错误码
 */
Int32 IGbc17691PublicKey(IGbc17691Encrypt *self, UInt8 *buf, UInt16 buf_len);

/**
 * 获取签名值接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待签名内容
 * @param content_len: 待签名内容长度
 * @param signature: 加密后的数字签名
 * @return 获得签名数据的长度，负数为错误码
 */
Int32 IGbc17691Signature(IGbc17691Encrypt *self, UInt8 encrypt_type, UInt8 *content, UInt16 content_len, TGbc17691Signature *signature);

/**
 * 加密接口
 * @param sender: 对象指针
 * @param encrypt_type: 加密类型,参考TGbc17691EncryptTypeEnum
 * @param content: 待加密内容
 * @param content_len: 待加密内容长度
 * @param cipher: 加密缓存
 * @param cipher_len: 加密缓存长度
 * @return 获得加密数据的长度，<=0 表示异常
 */
Int32 IGbc17691EncryptData(IGbc17691Encrypt *self, UInt8 encrypt_type, UInt8 *msg, UInt16 msg_len, UInt8 *cipher, UInt16 cipher_len);

#ifdef __cplusplus
}
#endif
#endif
/**
 * @} 
 */
